{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Chap3 Algorithm Analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:30.204684Z",
     "start_time": "2019-06-30T02:50:29.792064Z"
    }
   },
   "outputs": [],
   "source": [
    "import math\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from typing import List, TypeVar\n",
    "Num = TypeVar('Num', int, float)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Reinforcement"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### R-3.1\n",
    "Graph the functions $8n$, $4n\\log n$, $2n^2$ , $n^3$ , and $2^n$ using a logarithmic scale\n",
    "for the x- and y-axes; that is, if the function value $f(n)$ is y, plot this as a\n",
    "point with x-coordinate at log n and y-coordinate at log y."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:30.225498Z",
     "start_time": "2019-06-30T02:50:30.209819Z"
    }
   },
   "outputs": [],
   "source": [
    "def plot_loglog():\n",
    "    xs = range(1, 100)\n",
    "    plt.loglog(xs, [8*x for x in xs], basex=2, basey=2)\n",
    "    plt.loglog(xs, [4*x*np.log2(x) for x in xs], basex=2, basey=2)\n",
    "    plt.loglog(xs, [2*(x**2) for x in xs], basex=2, basey=2)\n",
    "    plt.loglog(xs, [x**3 for x in xs], basex=2, basey=2)\n",
    "    plt.loglog(xs, [2**x for x in xs], basex=2, basey=2)\n",
    "    plt.legend(['$8n$', '$4n\\\\logn$', '$2n^2$', '$n^3$', '2^n'])\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-29T02:56:56.358365Z",
     "start_time": "2019-06-29T02:56:55.313721Z"
    }
   },
   "source": [
    "fig=plt.figure(figsize=(10, 8), dpi= 80, facecolor='w', edgecolor='k')\n",
    "plot_loglog()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### R-3.2\n",
    "The number of operations executed by algorithms A and B is $8n\\log n$ and\n",
    "$2n^2$ , respectively. Determine $n_{0}$ such that A is better than B for $n ≥ n_0$ ."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "solution:\n",
    "$$8n\\log n = 2n^2$$\n",
    "$$4\\log n = n$$\n",
    "$$n_0 = 16$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### R-3.3\n",
    "The number of operations executed by algorithms A and B is $40n^2$ and\n",
    "$2n^3$ , respectively. Determine $n_0$ such that A is better than B for $n ≥ n_0$ ."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "solution:\n",
    "$$2n^3 = 40n^2$$\n",
    "$$n_0 = 20$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### R-3.4 \n",
    "Give an example of a function that is plotted the same on a log-log scale\n",
    "as it is on a standard scale."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "solution: Constant Function."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### R-3.5 \n",
    "Explain why the plot of the function $n^c$ is a straight line with slope $c$ on a\n",
    "log-log scale."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "solution:\n",
    "$$y = n^c$$\n",
    "$$\\log y = c \\cdot \\log n$$\n",
    "$$y^\\prime = c \\cdot x^\\prime$$\n",
    "$$where, y^\\prime = \\log y, x^\\prime = \\log x$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### R-3.6\n",
    "What is the sum of all the even numbers from $0$ to $2n$, for any positive\n",
    "integer $n$?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "solution:\n",
    "$$0 + 2 + 4 + \\cdots + 2n = 2 \\cdot (1 + 2 + \\cdots + n)  = n(n+1)$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### R-3.8\n",
    "Order the following functions by asymptotic growth rate."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$2^{10} < 3n+100\\log n < 4n < n\\log n < 4n\\log n+2n < n^2 + 10n < n^3 < 2^{\\log n} < 2 ^ n$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### # R-3.23 -> R-3.26\n",
    "计算下面示例代码的时间复杂度.注意下面的`count`或`num_calc`是为后面可视化而自行添加的. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:30.297910Z",
     "start_time": "2019-06-30T02:50:30.230475Z"
    }
   },
   "outputs": [],
   "source": [
    "def example1(S):\n",
    "    \"\"\"Return the sum of the elements in sequence S.\"\"\"\n",
    "    n = len(S)\n",
    "    total = 0\n",
    "    count = 0\n",
    "    for j in range(n):\n",
    "        total += S[j]\n",
    "        count += 1\n",
    "    return total, count\n",
    "\n",
    "def example2(S):\n",
    "    \"\"\"Return the sum of the elemnets in sequnce S.\"\"\"\n",
    "    n = len(S)\n",
    "    total = 0\n",
    "    count = 0\n",
    "    for j in range(0, n, 2):\n",
    "        total += S[j]\n",
    "        count += 1\n",
    "    return total, count\n",
    "\n",
    "def example3(S):\n",
    "    \"\"\"Return the sum of the elemnets in sequnce S.\"\"\"\n",
    "    n = len(S)\n",
    "    total = 0\n",
    "    count = 0\n",
    "    for j in range(n):\n",
    "        for k in range(1+j):\n",
    "            total += S[j]\n",
    "            count += 1\n",
    "    return total, count\n",
    "\n",
    "def example4(S):\n",
    "    \"\"\"Return the sum of the elemnets in sequnce S.\"\"\"\n",
    "    n = len(S)\n",
    "    prefix = 0\n",
    "    total = 0\n",
    "    count = 0\n",
    "    for j in range(n):\n",
    "        prefix += S[j]\n",
    "        total += prefix\n",
    "        count += 1\n",
    "    return total, count\n",
    "\n",
    "def example5(A, B):\n",
    "    n = len(A)\n",
    "    count = 0\n",
    "    num_calc = 0\n",
    "    for i in range(n):\n",
    "        total = 0\n",
    "        for j in range(n):\n",
    "            for k in range(1+j):\n",
    "                total += A[k]\n",
    "                num_calc += 1\n",
    "        if B[i] == total:\n",
    "            count+=1\n",
    "    return count, num_calc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-29T03:18:27.227570Z",
     "start_time": "2019-06-29T03:18:27.220578Z"
    }
   },
   "source": [
    "首先我们分析前面四段代码的复杂度,为了进行可视化,我们定义下面的函数:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:30.385387Z",
     "start_time": "2019-06-30T02:50:30.302871Z"
    }
   },
   "outputs": [],
   "source": [
    "def get_time_complexity_1(n, func):\n",
    "    op_nums = []\n",
    "    for i in range(1, n):\n",
    "        A = np.random.randint(0, 100, size=(i, ))\n",
    "        _, num_calc = func(A)\n",
    "        op_nums.append(num_calc)\n",
    "    fig=plt.figure(figsize=(8, 6), dpi= 80, facecolor='w', edgecolor='k')\n",
    "    plt.plot(op_nums)\n",
    "    plt.title(func.__name__)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### `example1`的时间复杂度为$O(n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:31.047619Z",
     "start_time": "2019-06-30T02:50:30.388158Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiAAAAGdCAYAAAArNcgqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAMTQAADE0B0s6tTgAAIABJREFUeJzt3XlclQX+/v+LHdlcUFB2F9AUheM2jkvrNNpeZiZlZdOMTSVqZuW0WU1jO7nV5LfVT42YqWXZYmZmWVqmLCIJyCLgxqIIyHo49++PPh9+OZWpcM4NnNfz8eCPs3Duy9ub+74e97nP+7gYhmEIAADAgVzNDgAAAJwPBQQAADgcBQQAADgcBQQAADgcBQQAADgcBQQAADgcBQQAADgcBQRAmxcVFaVXX33V7BgAWhEFBECHs2zZMo0dO1Y+Pj4KCwszOw6AX0EBAdDh1NXV6aqrrtIdd9xhdhQAv4ECAjiZpqYmPfzwwwoLC5O/v7/OP/98paenq6mpSaNHj9Zf/vKX5ufu3LlTXl5e+uabbyRJH3zwgUaNGiV/f3+FhITozjvv1IkTJ5qf/+ijj2rs2LFatGiRevXqpS5dumjBggWqr6/X3//+dwUEBKhfv37auHFj8++8+eabCgsL01tvvaXw8HD5+fnpb3/7mxoaGn7z35CXl6crrrhCfn5+CgkJ0YwZM1RTU9P8+KxZs3Tvvfdq8ODBrbnqALQiCgjgZB577DF9/PHHSk5OVkpKisaMGaOLL75YJ06c0PLly/XOO+/oww8/VH19vW6++WYlJiZqzJgxkn46s/Dggw8qLS1NK1eu1ObNm/XYY4+d9Prp6elKTU3V5s2btXDhQj344IO68sorNWjQIO3cuVPjx4/XzTfffFLBKC8v12uvvab169frvffe00cffaQFCxb8av6GhgaNHz9e0dHR2rlzp9atW6cdO3bonnvusd9KA9D6DABOo7a21ujUqZOxe/fuk+6Pjo423nrrLcMwDGPx4sVGz549jb/+9a/GgAEDjNra2t98veTkZKN3797Nt+fPn2907drVqKura76vf//+xmWXXdZ8+9ChQ4YkIz093TAMw3jjjTcMScaPP/7Y/JxXXnnFCAwMbL4dGRlpvPLKK4ZhGMby5cuNYcOGnZTjm2++MTw9PQ2r1XrS/W+88YYRGhp66pUCwBTuZhcgAI6Tm5ur2tpajRo16qT7a2trlZeXJ0maMWOGVq1apddee03bt2+Xt7d38/MyMzP14IMPaufOnTp27JisVqusVutJrxUdHS0vL6/m28HBwRo0aNBJtyWptLS0+T5/f38NGDCg+fbIkSNVXl6u8vJyBQYGnvT6u3fvVlpamvz8/JrvMwxDDQ0NOnDggCIiIs54vQBwPAoI4ESqq6slSV9++aW6dOly0mPdunWTJJWVlSk7O1uurq7Ky8vTyJEjm59z5ZVXasiQIfrPf/6joKAgffXVV5o+ffpJr+Ph4XHSbRcXl5Puc3FxkSTZbLZf3He6/4Zzzz1Xy5Yt+8VjvXr1Ou3XAWAuCgjgRM455xx5enrq0KFDGj58+K8+584779TgwYM1efJkzZgxQxdccIGCg4NVVlam3NxcrV69WvHx8ZKkVatWtUquyspKZWVlqX///pKkHTt2KDAw8BdnPyQpLi5OH3zwgcLCwk46OwOgfeEiVMCJBAQEaMaMGbrjjju0Zs0a5efna9u2bXrggQe0Z88eJScn67PPPtPrr7+u6dOna8SIEc1nOLp27aquXbvqlVdeUV5ent55551fPQtxNry9vXXHHXcoLS1NmzZt0vz583XXXXf96nNvvPFGeXp66vrrr9eOHTu0b98+ffjhh5o7d27zcw4fPqzU1FQVFhaqsbFRqampSk1NPeUnawA4FgUEcDLPPvus7rzzTs2dO1f9+/fX5MmTVVRUpMDAQM2YMUMvvPBC83UUr776qr766iu99dZbcnNz03/+8x999tlnGjRokJYtW6bHH3+8VTIFBgbq5ptv1qWXXqorr7xS48eP1wMPPPCrz/X399eXX34pT09PXXzxxYqLi9NDDz100tsvL7/8siwWi+bPn6+SkhJZLBZZLBYdPHiwVfICaDkXwzAMs0MAcF5vvvmmHnroIRUXF5sdBYADcQYEAAA4HAUEAAA4HG/BAAAAh+MMCAAAcDgKCAAAcLg2OYjMy8tLPXr0MDsGAAA4A6Wlpaqvrz+t57bJAtKjRw8+kgcAQDsTFhZ22s/lLRgAAOBwFBAAAOBwFBAAAOBwFBAAAOBwFBAAAOBwFBAAAOBwFBAAAOBwFBAAAOBwp1VAZs6cqaioKLm4uCgjI6P5/pycHI0ePVoxMTEaOXKkMjMzT+sxAADg3E6rgEyaNElbt25VZGTkSffffvvtmj59urKzs3XffffptttuO63HAACAc3MxDMM43SdHRUVp/fr1io2NVUlJiWJiYlRWViZ3d3cZhqFevXpp+/bt8vHx+c3HoqKifnc5YWFhjGIHAKCdOZPj91lfA1JUVKSQkBC5u//0dTIuLi6KiIhQYWHhKR/7NUlJSQoLC2v+qa6uPttYAACgHWjRRaguLi4n3f75yZRTPfbf5syZo+Li4uYfPz+/lsQCAABt3FkXkPDwcBUXF8tqtUr6qWAUFRUpIiLilI8BAABz7Nx/VPPXZZzypICjnHUBCQoKksVi0dtvvy1JWrNmjaKiohQVFXXKxwAAgGM12Qy9uHmfJi/brpU7irSvxPxLHU7rItS77rpL69at0+HDh9W9e3f5+flp3759ysrK0rRp01ReXq6AgAAtX75cgwYNkqRTPvZ7uAgVAIDWcaSyTne/k6pvc8sVE+ynpTcMVUywv12WdSbH7zP6FIyjUEAAAGi5zXtLdM+7aTp6okE3/iFCD18+UN4ebnZb3pkcv93tlgIAAJii3tqkZz7N0mtb8xXg7a5/3zhUlwzuZXask1BAAADoQPLLTigxeZcyDlRqeGRXLZwSr7CuPmbH+gUKCAAAHcTaXcV6+P0M1TQ2KfHCfpp1UbTc3drm175RQAAAaOeq66165P0MrU05oOAAL71yy3CN7tvd7FinRAEBAKAd2118XInJu1RQXqMLBwTp2UlDFOjnZXas30UBAQCgHTIMQ69tzdfTn+6Vi1z0yOUDdeuYqF9MIm+rKCAAALQz5dX1und1ur7YW6Le3X21JMGi2NDOZsc6IxQQAADakW9zyzR7ZapKquo1cWioHr8qVn5e7e9w3v4SAwDghKxNNi38PEcvfrlPPh5uSpocp4lDw8yOddYoIAAAtHHFx2o0a2Wqdu4/psGhnbU4waLe3X3NjtUiFBAAANqwT3Yf0v1r0lVZZ9Vfx/bWfRMGyNO9bc72OBMUEAAA2qC6xiY9vj5TK74rVKCvp96YNkIXDAgyO1aroYAAANDGZB2uUmLyLmUfqdaYfoF6YXK8ggK8zY7VqiggAAC0EYZhaMX3hXr8w0xZbYbuHd9ffz+vr9xc28dsjzNBAQEAoA04XtOoeWvT9UnGYYV26aTFCfEaFtnN7Fh2QwEBAMBkO/cf1czkVB2oqNWlg3vqyYlD1LmTh9mx7IoCAgCASZpshl7ekqukjdlyd3XRgmsGK2FkeLsZp94SFBAAAExwpLJOs1emalteuWKC/bT0hqGKCfY3O5bDUEAAAHCwL/Ye0dx303X0RINu/EOEHr58oLw93MyO5VAUEAAAHKTe2qSnP8nS69/kK8DbXf++caguGdzL7FimoIAAAOAAeaXVSkxO0Z6DlRoe2VULp8QrrKuP2bFMQwEBAMDO1uws1sPrMlTb2KSZF/bTzIui5e7W/septwQFBAAAO6mut+rh9zP0XsoBBQd46dVbhmt03+5mx2oTKCAAANhBxoHjmrFilwrKa3TRgCA9e12cuvl6mh2rzaCAAADQigzD0Gtb8/X0p3vlIhc9cvlA3Tomyilme5wJCggAAK2kvLpec99N0+asUvXu7qslCRbFhnY2O1abRAEBAKAVfLuvTLPfSVVJVb2uHRqmx68aJF8vDrO/hTUDAEALNDbZtPDzbL30Za58PNy08Pp4XW0JNTtWm0cBAQDgLBUdrdGslSnaVVihIWGdtXiKRVHdfc2O1S5QQAAAOAsf7z6k+9ekq6rOqr+N6617xw+Qp7tzz/Y4ExQQAADOQG1Dkx5fn6nk7wsV6OupN24doQv6B5kdq92hgAAAcJqyDlcpMXmXso9Ua0y/QL0wOV5BAd5mx2qXKCAAAPwOwzC04vtCPf5hpqw2Q/eO7687zusrV1dme5wtCggAAKdwvKZR89am65OMwwrt0kmLEywaFtnV7FjtHgUEAIDf8EPBUc1amaoDFbW6bHAvLZg4WJ07eZgdq0OggAAA8F+abIb+/eU+vfB5jjzcXPTkxMGaMiKcceqtiAICAMDPHKms0+yVqdqWV67+wf5aeoNF0cH+ZsfqcCggAAD8ry/2HtHcd9N19ESDpo6K0EOXDZS3h5vZsTokCggAwOnVW5v09CdZev2bfAV4u+vlqUM1IbaX2bE6NAoIAMCp5ZVWKzE5RXsOVmp4ZFctSrAotEsns2N1eBQQAIDTWrOzWA+vy1BtY5NmXthPMy+Klrsb49QdgQICAHA61fVWPfx+ht5LOaDgAC+9estwje7b3exYToUCAgBwKruLjysxeZcKymt00YAgPXtdnLr5epody+lQQAAATsFmM/T6N/l6+tO9cpGL5l8xUNNGRzHbwyQUEABAh1dWXa+576bpy6xS9enuq8UJFsWGdjY7llOjgAAAOrRv9pVp9jupKq2q16RhYXrsykHy9eLwZzb+BwAAHVJjk00vbMzWv7fkytfTXYumxOuq+FCzY+F/UUAAAB1O0dEazVyZopTCCg0J66wlCRZFBvqaHQs/QwEBAHQoH6Uf0ry16aqqs2r6uX0098/95enObI+2hgICAOgQahua9Pj6PUr+vkiBvp5689YROr9/kNmx8BsoIACAdm/v4UolrkhRTkm1xvbrrqTJcQoK8DY7Fk6BAgIAaLcMw9Db3xXqifWZstoM3Tehv/5+bl+5ujLbo62jgAAA2qXjNY26f026Pt1zWGFdO2lxgkVDI7qaHQuniQICAGh3fig4qlkrU3WgolaXDemlBdcMVudOHmbHwhmggAAA2o0mm6GXNu/TC59ny9PdVU9NHKzrR4QzTr0dooAAANqFw8frNPudFG3PO6oBPf21JMGi6GB/s2PhLFFAAABt3qYfj2juu2k6VtOom0ZF6sHLzpG3h5vZsdACFBAAQJtVb23Skx/v1ZvfFqhzJw+9PHWYJsT2NDsWWkGrjIbbsGGDhg0bJovFotjYWC1fvlySVFJSogkTJig6OlqxsbHaunVraywOAOAEckurdc2L3+rNbws0IqqrPp41jvLRgbT4DIhhGLrhhhu0efNmDRkyRAUFBRowYIAmTpyoefPmadSoUfr000+1Y8cOTZo0Sbm5uXJ358QLAODXGYahNbsO6JF1GaprbNLMi6I188J+cndjnHpH0mpNoKKiQpJUWVmpwMBAeXl5adWqVcrPz5ckjRgxQsHBwdq6davOP//81losAKADqa636uH3M/ReygH1DPDW69NGaFSfQLNjwQ5aXEBcXFy0atUqTZw4Ub6+vjp27JjWrl2rqqoq2Ww29ejRo/m5UVFRKiws/MVrJCUlKSkpqfl2dXV1S2MBANqZ9OIKJSanaH95jf50TpCemRSnbr6eZseCnbT4fJbVatWTTz6pdevWaf/+/dq0aZNuueUWSfrF57INw/jV15gzZ46Ki4ubf/z8/FoaCwDQTthshl75Kk/X/vtbHaqo06NXDNQrNw+nfHRwLT4DkpqaqoMHD2rMmDGSfnqrJSQkROnp6ZKk0tLS5rMg+/fvV0REREsXCQDoIMqq6zX33TR9mVWqPj18tSTBokEhnc2OBQdo8RmQ8PBwFRcXKysrS5K0b98+5ebmKiYmRtddd51efPFFSdKOHTt0+PBhjR07tqWLBAB0AN/sK9Mli77Wl1mlmjQsTB/OGEv5cCItPgMSHBysZcuWadKkSXJ1dZVhGHrppZcUGhqqp59+WjfddJOio6Pl6empt956i0/AAICTa2yy6YWN2fr3llz5erpr0ZR4XRUfanYsOJiL8VsXZpgoLCxMxcXFZscAALSyoqM1mrkyRSmFFRoS1llLEiyKDPQ1OxZayZkcvzkdAQBwiI/SD2ne2nRV1Vk1/dw+mvvn/vJ0Z7aHs6KAAADsqrahSY+v36Pk74vU3c9TS24dofP7B5kdCyajgAAA7Gbv4UolrkhRTkm1xvbrrqTr4xTk7212LLQBFBAAQKszDENvf1eoJ9Znqslm6P4JA3T7uX3k6ury+78Mp0ABAQC0qoqaBt2/Jl0b9hxReLdOWjzFIktEV7NjoY2hgAAAWs2OgqOalZyig8frdPmQXlowcbACvD3MjoU2iAICAGixJpuhpV/s06JN2fJ0d9XT1w7W5OHhv/hKDuD/UEAAAC1y6HitZq9M1Xf5RzWgp7+W3mBRvyB/s2OhjaOAAADO2sbMI7p3dZoqahp106hIPXjZOfL2cDM7FtoBCggA4IzVNTbpqU/26s1vC9S5k4eW3TRM4wf1NDsW2hEKCADgjOSWVitxRYoyD1VqZFQ3LZwSr5AuncyOhXaGAgIAOC2GYWj1zmLN/2CP6hqbNPOiaM28sJ/c3RinjjNHAQEA/K6qukY99H6G1qUeVM8Ab70+bYRG9Qk0OxbaMQoIAOCU0ooqNHNlivaX1+hP5wTr2UlD1NXX0+xYaOcoIACAX2WzGXp1a56e+TRLrq4ueuzKQbr5j5HM9kCroIAAAH6htKpe97ybpq+yS9Wnh6+WJgzVwJAAs2OhA6GAAABO8nVOqe5+J01l1fWaPDxMj145SD6eHC7QutiiAACSpMYmm5I2ZuvlLbny9XTXoinxuio+1OxY6KAoIAAAFR2t0cyVKUoprFBcWGctTrAoMtDX7FjowCggAODk1qcf1D/W7FZVvVW3n9dH91zcX57uzPaAfVFAAMBJ1TY06bEP92jljiJ19/PUizeO1LkxPcyOBSdBAQEAJ7T3cKVmrEjRvpJqjYvurqTJ8erh72V2LDgRCggAOBHDMPT2d4X65/pM2WyG5l0yQNPH9ZGrK7M94FgUEABwEhU1Dbp/Tbo27Dmi8G6dtHiKRZaIrmbHgpOigACAE9hRcFSzklN08HidLh/SSwsmDlaAt4fZseDEKCAA0IE12Qwt/WKfFm3Klpe7m56+drAmDw9nnDpMRwEBgA7q0PFazV6Zqu/yj2pAT38tvcGifkH+ZscCJFFAAKBD2ph5RPeuTlNFTaNu/mOkHrj0HHl7uJkdC2hGAQGADqSusUlPfbJXb35boM6dPLTspmEaP6in2bGAX6CAAEAHkVtarcQVKco8VKmRUd20cEq8Qrp0MjsW8KsoIADQzhmGodU7i/XIuj2qtzZp9p+iNeOCfnJ3Y5w62i4KCAC0Y1V1jXrwvQx9kHZQPQO8tWjKCP2hT6DZsYDfRQEBgHYqrahCickpKjxao4sHBuuZa4eoq6+n2bGA00IBAYB2xmYz9MrXeXp2Q5ZcXV30+FWDdNOoSGZ7oF2hgABAO1JaVa973k3TV9ml6tPDV0sThmpgSIDZsYAzRgEBgHbi65xS3f1Omsqq6zV5eJgevXKQfDzZjaN9YssFgDauscmm5z7L0rItefLzctfiBIuujAsxOxbQIhQQAGjDio7WKDE5RalFFYoL76IlUyyKCPQxOxbQYhQQAGijPkw7qAfW7lZVvVW3n9dHc//cXx7M9kAHQQEBgDampsGqxz7I1Ds/FKm7n5demjpU46J7mB0LaFUUEABoQ348VKkZK3Ypt/SExkV3V9LkePXw9zI7FtDqKCAA0AYYhqG3tu/XEx/9KJvN0D8uGaC/jesjV1dme6BjooAAgMkqahp03+p0fZZ5RBHdfLQ4waL48C5mxwLsigICACb6Pv+oZq1M0aHjdboyLkT/uiZW/t4eZscC7I4CAgAmaLIZWvJFjhZvypGXu5uemTRE1w0LY5w6nAYFBAAc7NDxWs1emarv8o/qnF4BWpJgUb8gP7NjAQ5FAQEAB9qYeUT3rk5TRU2jpo2O0rxLBsjbw83sWIDDUUAAwAHqGpv01Cd79ea3Beri46FXbh6uiwcGmx0LMA0FBADsbF9JtRKTU/TjoUqN7N1Ni6bEq1fnTmbHAkxFAQEAOzEMQ+/uLNb8dXtUb23S3X+K0YwL+8mN2R4ABQQA7KGyrlEPvZehD9IOqldnby2aMlIje3czOxbQZlBAAKCVpRZVKDF5l4qO1urPA4P1zKQh6uLjaXYsoE2hgABAK7HZDP2/r/P03IYsubq66PGrBummUZHM9gB+BQUEAFpBaVW95qxK1dc5Zerbw1dLEoZqYEiA2bGANosCAgAt9FV2qeasSlNZdb2uHx6u+VcOlI8nu1fgVPgLAYCz1Nhk03OfZWnZljz5e7lrcYJFV8aFmB0LaBcoIABwFgrLa5S4MkVpRRWKC++iJVMsigj0MTsW0G5QQADgDH2YdlAPrN2tqnqr/n5eX93z5xh5uLmaHQtoV1rlL6a+vl4zZsxQdHS0Bg0apKlTp0qScnJyNHr0aMXExGjkyJHKzMxsjcUBgClqGqy6b3WaEpNT5OXhpv/5y0jNu2QA5QM4C61yBmTevHlydXVVdna2XFxcdOjQIUnS7bffrunTp2vatGlavXq1brvtNm3btq01FgkADpV5sFKJybuUW3pC58b00PPXxamHv5fZsYB2y8UwDKMlL3DixAmFhoaquLhYfn7//9dJl5SUKCYmRmVlZXJ3d5dhGOrVq5e2b9+uqKioU75mWFiYiouLWxILAFqFYRj6n2379a+Pf5TNZui+Cf3117F95Mo4deAXzuT43eLzhrm5uQoMDNQTTzyh4cOHa9y4cdq0aZOKiooUEhIid/efTrK4uLgoIiJChYWFv3iNpKQkhYWFNf9UV1e3NBYAtNixEw2a/tZOzf9gj3oGeGv1HaM1/dy+lA+gFbS4gDQ2NiovL08DBw7UDz/8oKVLl2rKlCmyWq2/mP73Wydb5syZo+Li4uafn59JAQAzfJdXrksXf62NmUd0ZVyIPpo5VvHhXcyOBXQYLb4GJDIyUq6urrrxxhslSXFxcerdu7f279+v4uJiWa3W5rdgioqKFBER0eLQAGAv1iablnyxT0u+yJGXu5uenTREk4aFMU4daGUtPgPSvXt3XXTRRdqwYYMkaf/+/crPz9e4ceNksVj09ttvS5LWrFmjqKio373+AwDMcrCiVje8+p0WbcpR/54B+jBxrK4bHk75AOygxRehSlJeXp7+8pe/qLy8XG5ubpo/f76uueYaZWVladq0aSovL1dAQICWL1+uQYMG/e7rcREqAEf7bM9h3bcmXRU1jZo2OkrzLhkgbw83s2MB7cqZHL9bpYC0NgoIAEepa2zSkx//qOXb9qurj4eenRSnPw0MNjsW0C6dyfGbSagAnNa+kmolJqfox0OV+kPvblo0xaKenb3NjgU4BQoIAKdjGIZW/VCkRz/IVL21SXf/KUYzLuwnNz5eCzgMBQSAU6msa9QDa3drffohhXT21sIpIzWydzezYwFOhwICwGmkFlUoMXmXio7W6s8Dg/XMpCHq4uNpdizAKVFAAHR4NpuhZV/l6fnPsuTq6qJ/XjVIU0dF8vFawEQUEAAdWklVne5Zlaavc8rUL8hPSxIsOqdXgNmxAKdHAQHQYX2VXao5q1JVVt2gKSPC9cgVA+XjyW4PaAv4SwTQ4TRYbXp+Y5aWbcmTv5e7liRYdEVciNmxAPwMBQRAh1JYXqPElSlKK6pQfHgXLUmwKLybj9mxAPwXCgiADmNd6gE9+F6GTjRYdcf5fTXn4hh5uLX4K68A2AEFBEC7V9Ng1fx1e/TuzmL18PfSy1OHaWx0d7NjATgFCgiAdm3PweNKTE5RXukJnRfTQ89PjlN3Py+zYwH4HRQQAO2SYRj6n2379a+PfpQhQw9eeo5uG9tbroxTB9oFCgiAdufYiQbdtyZdGzOPKDLQR0sSLBoS1sXsWADOAAUEQLuyPa9cs1em6nBlna6KD9ETV8fK39vD7FgAzhAFBEC7YG2yackX+7Tkixx5e7jp2UlDNGlYGOPUgXaKAgKgzTtYUavZK1P1fcFRDewVoCU3WNS3h5/ZsQC0AAUEQJv22Z7Dum9NuipqGjVtdJT+cekAebm7mR0LQAtRQAC0SXWNTVrw8Y/6n2371dXHQ6/ePFx/GhhsdiwArYQCAqDN2VdSpRkrUrT3cJX+0LubFk2xqGdnb7NjAWhFFBAAbYZhGFr1Q5Ee/SBT9dYmzbk4Rndd0E9uzPYAOhwKCIA2obKuUQ+s3a316YfUq7O3Fk0ZqZG9u5kdC4CdUEAAmC6l8JhmrkxR0dFajR8UrKevHaIuPp5mxwJgRxQQAKax2Qwt+ypPz3+WJVdXF/3z6lhN/UMEsz0AJ0ABAWCKkqo63bMqTV/nlKlfkJ+W3mDRgJ4BZscC4CAUEAAOtyW7VPesSlVZdYMSRobrkcsHqZMnsz0AZ0IBAeAwDVabnvssS//vqzz5e7tr6Q0WXT4kxOxYAExAAQHgEPvLTygxOUXpxcdlieiixVMsCu/mY3YsACahgACwu3WpB/Tgexk60WDVHef31ZyLY+Th5mp2LAAmooAAsJsT9VbN/2CPVu8sVg9/L708dZjGRnc3OxaANoACAsAu9hw8rsTkFOWVntB5MT30/OQ4dffzMjsWgDaCAgKgVRmGoTe/LdCTH++VIUMPXnqObhvbW66MUwfwMxQQAK3m6IkG3bc6TZ//WKLIQB8tnmJRXHgXs2MBaIMoIABaxbbcct39TqoOV9bp6vgQ/fPqWPl7e5gdC0AbRQEB0CLWJpsWf7FPS7/IkbeHm567Lk7XDg1lnDqAU6KAADhrBytqNWtlinYUHNOgkAAtTrCobw8/s2MBaAcoIADOyqcZh3X/mnQdr23UrWOiNO+SAfJyZ5w6gNNDAQFwRuoam/Svj37UW9v3q6uPh167ZbguOidGp6v1AAAcM0lEQVTY7FgA2hkKCIDTtq+kSjNWpGjv4SqN6tNNC6+3qGdnb7NjAWiHKCAAfpdhGHpnR5Ee/XCPGpsM3XNxjO68oJ/cmO0B4CxRQACcUmVdox5Yu1vr0w8ptEsnLZoSr+FR3cyOBaCdo4AA+E27Co9pZnKKio/V6pLYnnpq4hB19mG2B4CWo4AA+AWbzdCyr/L0/GdZcnN10RNXx+rGP0Qw2wNAq6GAADhJSVWd7lmVpq9zyhQd5KelNwxV/57+ZscC0MFQQAA025JdqntWpaqsukEJIyP0yOUD1cmT2R4AWh8FBIAarDY991mW/t9XefL3dtfSGyy6fEiI2bEAdGAUEMDJFZSd0MyVKUovPi5LRBctnmJReDcfs2MB6OAoIIATW5d6QA++l6ETDVbdeX5f3X1xjDzcXM2OBcAJUEAAJ3Si3qpH1u3Rml3F6uHvpWU3DdOYft3NjgXAiVBAACez5+BxJa5IUV7ZCZ3fv4eeuy5O3f28zI4FwMlQQAAnYRiG3vy2QE9+vFeGDD102Tn6y5jecmWcOgATUEAAJ3D0RIPuW52mz38sUVSgjxYnWDQkrIvZsQA4MQoI0MFtyy3X7HdSdKSyXtdYQvXPq2Pl58WfPgBzsRcCOihrk02LNuVo6eZ96uThpuevi9O1w8LMjgUAkiggQId0oKJWs5JT9MP+YxoUEqAlCRb16eFndiwAaEYBATqYTzMO6b7V6aqss+rWMVGad8kAebkzTh1A20IBATqIusYmPfFRpt7eXqhuvp567ZbhuuicYLNjAcCvooAAHUDOkSolJqdo7+Eq/bFPoBZOiVdwgLfZsQDgN7XazOXHHntMLi4uysjIkCTl5ORo9OjRiomJ0ciRI5WZmdlaiwLwvwzDUPL3hbpi6VbllFRr7p9j9PZf/0D5ANDmtUoB2bVrl7Zv366IiIjm+26//XZNnz5d2dnZuu+++3Tbbbe1xqIA/K/jtY2asSJF/1i7W4G+Xlp1+yjNuDBabgwWA9AOtLiA1NfX66677tJLL70kF5efdnwlJSXatWuXpk6dKkm69tprlZ+fr4KCgpYuDoCkXYXHdNnir/XR7kO6JLanPp45TsMiu5kdCwBOW4uvAXnkkUc0depU9e7du/m+oqIihYSEyN39p5d3cXFRRESECgsLFRUV1dJFAk7LZjP08le5ev6zbLm7uuhf18TqhpERzeUfANqLFhWQbdu2aceOHXrqqad+8dh/7xANw/jN10lKSlJSUlLz7erq6pbEAjqkkso63b0qVd/sK1d0kJ+W3jBU/Xv6mx0LAM5Ki96C2bJli/bu3avevXsrKipKxcXFGj9+vDIyMlRcXCyr1Srpp/JRVFR00jUiPzdnzhwVFxc3//j5MTAJ+LnNWSW6ZNHX+mZfuW74Q4Q+mDGW8gGgXWtRAZk3b54OHjyogoICFRQUKCwsTBs2bNAtt9wii8Wit99+W5K0Zs0aRUVF8fYLcIYarDb966NM3frGDjU02fTSjUO14JrB6uTJYDEA7Zvd5oAsW7ZM06ZN04IFCxQQEKDly5fba1FAh1RQdkIzV6Yovfi4hkZ00aIpFoV38zE7FgC0ChfjVBdnmCQsLEzFxcVmxwBM837KAT343m7VNDbpzvP7avafYuTh1mpjewDALs7k+M0kVKANOVFv1SPr9mjNrmIF+XvplZuHa3S/7mbHAoBWRwEB2oiMA8c1MzlFeWUndEH/HnruujgF+nmZHQsA7IICApjMMAy98U2BnvpkrwwZeuiyc3Tb2N7M9gDQoVFAABOVV9fr3tXp+mJviaICfbQkYagGh3U2OxYA2B0FBDDJt7lluvudVB2prNdES6gevzpWfl78SQJwDuztAAezNtm0aFOOlm7ep04ebkqaHKeJQ8PMjgUADkUBARzoQEWtZiWn6If9xxQbGqAlCUPVu7uv2bEAwOEoIICDfJpxSPetTldlnVV/GdNb91/SX17uTDQF4JwoIICd1TU26Z/rM/Wf7wrV1cdDr08brgsHBJsdCwBMRQEB7Cj7SJUSV6Qo60iV/tgnUAunxCs4wNvsWABgOgoIYAeGYWjljiI99uEeNTYZmvvnGN1xfj+5uTLbAwAkCgjQ6o7XNuqBtbv10e5DCu3SSYsT4jUsspvZsQCgTaGAAK1o5/5jmpmcogMVtboktqeemjhEnX08zI4FAG0OBQRoBU02Qy9vyVXSxmy5u7roX9fE6oaREYxTB4DfQAEBWuhIZZ3mrErVN/vKFRPspyUJQ9W/p7/ZsQCgTaOAAC2weW+J7nk3TUdPNOiGP0To4csGqpMnsz0A4PdQQICz0GC16ZlP9+rVrfkK8HbXSzcO1aWDe5kdCwDaDQoIcIbyy05oZnKKdh84rmGRXbVoSrzCuvqYHQsA2hUKCHAG3ksp1kPvZaimsUkzLuin2X+Klrubq9mxAKDdoYAAp+FEvVUPr8vQ2l0HFOTvpVduHq7R/bqbHQsA2i0KCPA7Mg4cV2JyivLLTujCAUF6dtIQBfp5mR0LANo1CgjwGwzD0OvfFOjpT/bKkKGHLx+ov4yJYrYHALQCCgjwK8qr63Xv6nR9sbdEvbv7akmCRbGhnc2OBQAdBgUE+C/f5pZp9spUlVTVa6IlVI9fHSs/L/5UAKA1sVcF/pe1yaaFn+foxS/3ycfDTUmT4zRxaJjZsQCgQ6KAAJKKj9Vo1spU7dx/TLGhAVqSMFS9u/uaHQsAOiwKCJzepxmHdN/qdFXWWfXXsb1174T+8nJnnDoA2BMFBE6rrrFJ/1yfqf98V6huvp56Y9oIXTAgyOxYAOAUKCBwStlHqpS4IkVZR6o0um+gXrg+XsEB3mbHAgCnQQGBUzEMQ8nfF+nx9XvU2GTo3vH99ffz+srNldkeAOBIFBA4jeO1jfrH2nR9vPuwQrt00uIEi4ZFdjU7FgA4JQoInMLO/Uc1MzlVBypqddngXlowcbA6d/IwOxYAOC0KCDq0Jpuhl7fkKmljttxdXbTgmsFKGBnOOHUAMBkFBB3Wkco63f1Oqr7NLVf/YH8tucGimGB/s2MBAEQBQQe1eW+J7nk3TUdPNGjqqAg9dNlAeXsw2wMA2goKCDqUemuTnvk0S69tzVeAt7tenjpUE2J7mR0LAPBfKCDoMPLLTigxeZcyDlRqeGRXLZwSr7CuPmbHAgD8CgoIOoT3Uor10HsZqmlsUuKF/TTromi5u7maHQsA8BsoIGjXquuteuT9DK1NOaDgAC+9cstwje7b3exYAIDfQQFBu7W7+LhmrkxRftkJXTggSM9OGqJAPy+zYwEATgMFBO2OYRh6bWu+nv50r1zkokcuH6hbx0Qx2wMA2hEKCNqV8up6zX03TZuzStW7u6+WJFgUG9rZ7FgAgDNEAUG78e2+Ms1+J1UlVfWaODRUj18VKz8vNmEAaI/Ye6PNszbZ9MLn2Xrpy1z5eLjphevjdI0lzOxYAIAWoICgTSs+VqNZK1O1c/8xDQ7trCUJFkV19zU7FgCghSggaLM+3n1I969JV1WdVX8d21v3TRggT3dmewBAR0ABQZtT29Ckx9dnKvn7QgX6euqNW0fogv5BZscCALQiCgjalKzDVUpM3qXsI9Ua0y9QL0yOV1CAt9mxAACtjAKCNsEwDP3nu0L9c32mrDZD947vrzvO6ytXV2Z7AEBHRAGB6Y7XNGre2nR9knFYoV06aXGCRcMiu5odCwBgRxQQmOqHgqOatTJVBypqddngXlowcbA6d/IwOxYAwM4oIDBFk83Qv7/cpxc+z5GHm4uenDhYU0aEM04dAJwEBQQOd6SyTrNXpmpbXrn6B/tryQ0WxQT7mx0LAOBAFBA41Bd7j2juu+k6eqJBU0dF6KHLBsrbw83sWAAAB6OAwCHqrU16+pMsvf5NvgK83fXy1KGaENvL7FgAAJNQQGB3eaXVSkxO0Z6DlRoe2VWLEiwK7dLJ7FgAABNRQGBXa3YW6+F1GaptbNLMC/tp5kXRcndjnDoAODsKCOyiut6qh9/P0HspBxQc4KXXbhmhP/YNNDsWAKCNoICg1e0uPq7E5F0qKK/RRQOC9Ox1cerm62l2LABAG9Lic+F1dXW6+uqrFRMTo/j4eE2YMEEFBQWSpJKSEk2YMEHR0dGKjY3V1q1bW7o4tGE2m6FXv87TxH9/o4MVdXrk8oF69ZbhlA8AwC+0ypvx06dPV1ZWllJTU3X55Zdr+vTpkqR58+Zp1KhRysnJ0RtvvKEbb7xRVqu1NRaJNqa8ul63Ld+hJz76UeFdfbT2ztH6y9jeDBYDAPyqFhcQb29vXXrppc0HmlGjRikvL0+StGrVKt11112SpBEjRig4OJizIB3Qt/vKdMmir7U5q1SThoXpw8Sxig3tbHYsAEAb1urXgCxevFhXXHGFysvLZbPZ1KNHj+bHoqKiVFhY+IvfSUpKUlJSUvPt6urq1o4FO2hssmnh59l66ctc+Xq6a+H18braEmp2LABAO9CqBWTBggXKycnRyy+/rNra2l+cfjcM41d/b86cOZozZ07z7bCwsNaMBTsoOlqjWStTtKuwQkPCOmtJgkWRgb5mxwIAtBOtVkCee+45rV27Vp9//rl8fHzk4+MjSSotLW0+C7J//35FRES01iJhko93H9L9a9JVVWfV38b11r3jB8jTndkeAIDT1ypHjaSkJCUnJ2vjxo3q0qVL8/3XXXedXnzxRUnSjh07dPjwYY0dO7Y1FgkT1DY06R9rd+vO/+ySp5ur3rh1hB68bCDlAwBwxlyM33pf5DQVFxcrPDxcffr0kb//T99o6uXlpe+++05HjhzRTTfdpPz8fHl6euqll17Seeed97uvGRYWpuLi4pbEQivLOlylxORdyj5SrTH9AvXC5HgFBXibHQsA0IacyfG7xQXEHiggbYdhGPrPd4X65/pMWW2G5lwcozvO6ytXVz5eCwA42Zkcv5mEit90vKZR89am65OMwwrt0kmLEywaFtnV7FgAgA6AAoJf9UPBUc1amaoDFbW6bHAvLZg4WJ07eZgdCwDQQVBAcJImm6GXNu/Twk058nBz0ZMTB2vKiHAmmgIAWhUFBM0OH6/T3e+kalteuQb09NeSBIuig/3NjgUA6IAoIJAkbfrxiOa+m6ZjNY2aOipCD102UN4ebmbHAgB0UBQQJ1dvbdJTn+zVG98UKMDbXS9PHaYJsT3NjgUA6OAoIE4sr7Raickp2nOwUiOiumrhFItCu3QyOxYAwAlQQJyQYRhas+uAHlmXodrGJs28KFozL+wndzcmmgIAHIMC4mSq66166L3dej/1oIIDvPTaLSP0x76BZscCADgZCogTSS+uUGJyivaX1+iiAUF69ro4dfP1NDsWAMAJUUCcgM1m6LWt+Xpmw165yEXzrxioaaOjmO0BADANBaSDK6uu1z2r0rQlu1R9uvtqcYJFsaGdzY4FAHByFJAO7Jt9ZZr9TqpKq+o1aViYHrtykHy9+C8HAJiPo1EH1Nhk0wsbs/XvLbny9XTXoinxuio+1OxYAAA0o4B0MEVHazRzZYpSCis0JKyzliRYFBnoa3YsAABOQgHpQD5KP6R5a9NVVWfV9HP7aO6f+8vTndkeAIC2hwLSAdQ2NOnx9XuU/H2Ruvt5asmtI3R+/yCzYwEA8JsoIO3c3sOVSlyRopySao3t111J18cpyN/b7FgAAJwSBaSdMgxDb39XqCfWZ6rJZuj+CQN0+7l95OrKbA8AQNtHAWmHjtc06v416fp0z2GFde2kxQkWDY3oanYsAABOGwWknfmh4KhmrUzVgYpaXT6klxZMHKwAbw+zYwEAcEYoIO1Ek83Qi5v3aeHn2fJ0d9XT1w7W5OHhjFMHALRLFJB24PDxOs1+J0Xb845qQE9/Lb3Bon5B/mbHAgDgrFFA2rhNPx7R3HfTdKymUTf/MVIPXHqOvD3czI4FAECLUEDaqHprk578eK/e/LZAnTt5aNlNwzR+UE+zYwEA0CooIG1Qbmm1ElekKPNQpUZGddPCKfEK6dLJ7FgAALQaCkgbYhiG1uw6oEfWZaiusUkzL4rWzAv7yd2NceoAgI6FAtJGVNU16uH3M/R+6kH1DPDW69NGaFSfQLNjAQBgFxSQNiC9uEKJySnaX16jP50TpGcmxambr6fZsQAAsBsKiIlsNkOvbc3XMxv2ykUuevSKgbpldBSzPQAAHR4FxCRl1fWa+26avswqVZ8evlqSYNGgkM5mxwIAwCEoICbYmlOmu1elqrSqXtcNC9NjVw2Sjyf/FQAA58FRz4Eam2xK2pitl7fkytfTXYumxOuq+FCzYwEA4HAUEAcpOlqjmStTlFJYobiwzlqcYFFkoK/ZsQAAMAUFxAE+TDuoB9buVlW9VdPP7aO5f+4vT3dmewAAnBcFxI5qG5r02Id7tHJHkbr7eWrpjSN1XkwPs2MBAGA6Coid7D1cqRkrUrSvpFrjorvr+clxCvL3NjsWAABtAgWklRmGobe379c/P/pRNpuheZcM0PRxfeTqymwPAAD+DwWkFVXUNOj+NenasOeIwrt10uIpFlkiupodCwCANocC0kp2FBzVrOQUHTxep8uH9NKCiYMV4O1hdiwAANokCkgLNdkMvbh5nxZ+ni0vdzc9c+0QXTc8jHHqAACcAgWkBQ4dr9Xslan6Lv+oBvT019IbLOoX5G92LAAA2jwKyFnamHlE965OU0VNo27+Y6QeuPQceXu4mR0LAIB2gQJyhuoam/TUJ3v15rcF6tzJQ8tuGqbxg3qaHQsAgHaFAnIGckurlbgiRZmHKjUyqpsWTolXSJdOZscCAKDdoYCcBsMwtHpnseZ/sEd1jU2adVG0Ei/sJ3c3xqkDAHA2KCC/o6quUQ+9n6F1qQfVM8Bbr08boVF9As2OBQBAu0YBOYW0ogrNXJmi/eU1unhgsJ65doi6+nqaHQsAgHaPAvIrbDZDr27N0zOfZsnV1UWPXTlIN/8xktkeAAC0EgrIfymtqtc976bpq+xS9enhq6UJQzUwJMDsWAAAdCgUkJ/5OqdUd7+TprLqek0eHqZHrxwkH09WEQAArY2jq6TGJpue/yxbL2/JlZ+XuxZNiddV8aFmxwIAoMNy+gJSdLRGickpSi2qUFx4Fy2ZYlFEoI/ZsQAA6NCcuoCsTz+of6zZrap6q24/r4/uubi/PN2Z7QEAgL05ZQGpabDq8Q8ztXJHkbr7eerFG0fq3JgeZscCAMBpOF0B+fFQpWas2KXc0hMaF91dz0+OU5C/t9mxAABwKk5TQAzD0Fvb9+uJj36UzWboH5cM0N/G9ZGrK7M9AABwNKcpIE989KNe25qviG4+WpxgUXx4F7MjAQDgtOx+xWVOTo5Gjx6tmJgYjRw5UpmZmfZe5K+6xhKqiZZQrZ85lvIBAIDJ7F5Abr/9dk2fPl3Z2dm67777dNttt9l7kb8qNrSzkq6PV4C3hynLBwAA/z8XwzAMe714SUmJYmJiVFZWJnd3dxmGoV69emn79u2Kior6zd8LCwtTcXGxvWIBAAA7OJPjt13PgBQVFSkkJETu7j9dauLi4qKIiAgVFhae9LykpCSFhYU1/1RXV9szFgAAMJnd34L572+Q/bUTLnPmzFFxcXHzj5+fn71jAQAAE9m1gISHh6u4uFhWq1XST+WjqKhIERER9lwsAABo4+xaQIKCgmSxWPT2229LktasWaOoqKhTXv8BAAA6PrtehCpJWVlZmjZtmsrLyxUQEKDly5dr0KBBp/wdLkIFAKD9OZPjt90HkfXv31/btm2z92IAAEA7wle/AgAAh6OAAAAAh6OAAAAAh6OAAAAAh6OAAAAAh6OAAAAAh6OAAAAAh7P7ILKz4eXlpR49erT661ZXV/M9Mw7E+nYs1rdjsb4di/XtWGe7vktLS1VfX39az22TBcRemLDqWKxvx2J9Oxbr27FY347liPXNWzAAAMDhKCAAAMDh3B599NFHzQ7hSH/84x/NjuBUWN+Oxfp2LNa3Y7G+Hcve69uprgEBAABtA2/BAAAAh6OAAAAAh6OAAAAAh3OaApKTk6PRo0crJiZGI0eOVGZmptmROoy6ujpdffXViomJUXx8vCZMmKCCggJJUklJiSZMmKDo6GjFxsZq69at5obtYB577DG5uLgoIyNDEtu5vdTX12vGjBmKjo7WoEGDNHXqVEmsb3vZsGGDhg0bJovFotjYWC1fvlwS+5PWMnPmTEVFRZ2075BOvT3bZVs3nMQFF1xgvPHGG4ZhGMa7775rjBo1ytxAHUhtba3x0UcfGTabzTAMw1iyZIlx8cUXG4ZhGLfeeqsxf/58wzAM4/vvvzciIiKMxsZGs6J2KDt37jQmTJhgREREGLt37zYMg+3cXmbPnm0kJiY2b+MHDx40DIP1bQ82m83o1q2bkZaWZhiGYeTn5xteXl5GZWUl+5NWsmXLFqOoqMiIjIxs3ncYxqm3Z3ts605RQI4cOWJ07ty5eUO12WxGcHCwkZ+fb26wDmrHjh1G3759DcMwDF9fX6OkpKT5sREjRhibN282KVnHUVdXZ4waNcrIy8tr3omwndtHdXW10blzZ6Oqquqk+1nf9vF/BWTLli2GYRhGWlqaERISYtTX17M/aWU/LyCn2p7tta07xVswRUVFCgkJkbu7uyTJxcVFERERKiwsNDlZx7R48WJdccUVKi8vl81mO+l7faKioljvreCRRx7R1KlT1bt37+b72M7tIzc3V4GBgXriiSc0fPhwjRs3Tps2bWJ924mLi4tWrVqliRMnKjIyUmPHjtXy5ctVVVXF/sSOTrU922tbd4oCIv20wn7OYPyJXSxYsEA5OTn617/+JYn1bg/btm3Tjh07dOedd/7iMdZ362tsbFReXp4GDhyoH374QUuXLtWUKVNktVpZ33ZgtVr15JNPat26ddq/f782bdqkW265RRLbt72dav3aY907RQEJDw9XcXGxrFarpJ9WXFFRkSIiIkxO1rE899xzWrt2rT755BP5+PgoMDBQ0k/fjvh/9u/fz3pvoS1btmjv3r3q3bu3oqKiVFxcrPHjxysjI4Pt3A4iIyPl6uqqG2+8UZIUFxen3r17a//+/axvO0hNTdXBgwc1ZswYSdKIESMUEhKi9PR0SexP7OVUx0l7HUOdooAEBQXJYrHo7bffliStWbNGUVFRioqKMjdYB5KUlKTk5GRt3LhRXbp0ab7/uuuu04svvihJ2rFjhw4fPqyxY8eaFbNDmDdvng4ePKiCggIVFBQoLCxMGzZs0C233MJ2bgfdu3fXRRddpA0bNkj66aCXn5+vcePGsb7t4P8OdllZWZKkffv2KTc3VzExMexP7OhUx0m7HUNbdAVJO7J3715j1KhRRnR0tDFs2DAjIyPD7EgdRlFRkSHJ6NOnjxEXF2fExcUZI0eONAzDMA4fPmxcfPHFRr9+/YyBAwcaX375pclpO56fX0jGdm4fubm5xnnnnWfExsYacXFxxtq1aw3DYH3by4oVK4zY2FhjyJAhxuDBg43k5GTDMNiftJY777zTCA0NNdzc3Izg4ODmDw2canu2x7bOd8EAAACHc4q3YAAAQNtCAQEAAA5HAQEAAA5HAQEAAA5HAQEAAA5HAQEAAA5HAQEAAA5HAQEAAA73/wFhyZ/9R5uPywAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f64c3f7c860>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "get_time_complexity_1(100, example1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### `example2`的时间复杂度为$O(n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:31.272073Z",
     "start_time": "2019-06-30T02:50:31.050151Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhkAAAGdCAYAAAC/02HYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAMTQAADE0B0s6tTgAAIABJREFUeJzt3XtcVHX+x/H3wHARAVEUFbl5AU1RINPMsqzNctusNtNqNXPX/eluWb9Cs7b71W5GbW39crta7rrhpezqpdYulpZpgIgXVBAQFUG5X4c5vz/anSTUABnPzPB6Ph4+HjvfMwNvz04zb8/5zByLYRiGAAAA2pmX2QEAAIBnomQAAACnoGQAAACnoGQAAACnoGQAAACnoGQAAACnoGQAAACnoGQAcAkxMTF69dVXzY4BoB1RMgC4nYaGBs2bN09DhgxRQECAoqKidPvtt6uqqsrsaACOYTU7AAC0VnV1tTIyMvTwww9r2LBhKigo0KxZs1RWVqbXX3/d7HgA/oMjGYAHamxs1H333aeIiAgFBQVp7NixysjIUGNjo0aPHq0//OEPjvtu3rxZfn5++vrrryVJ77//vkaNGqWgoCCFh4frpptuanKE4MEHH9R5552nv/71r+rdu7dCQkI0f/581dXV6U9/+pOCg4M1YMAArV271vGYN998UxEREXr77bcVGRmpwMBA/c///I/q6+tP+HfYu3evJkyYoMDAQIWHh2v27Nmqrq6WJHXp0kWrVq3SxIkTFRsbqwsvvFAPPfSQ3nvvvfbelQBOASUD8EAPPfSQPv74Yy1ZskQ//PCDzj33XI0bN05VVVVatGiR3nnnHX3wwQeqq6vTtGnTdMstt+jcc8+VJNXW1uqee+5Renq6/vWvf2ndunV66KGHmvz8jIwMpaWlad26dXruued0zz336IorrtCQIUO0efNmXXrppZo2bVqTElFSUqLXXntNH374od5991199NFHmj9//nHz19fX69JLL1VsbKw2b96slStXatOmTZozZ84J/87FxcXq1q1bO+w9AO3GAOBRampqjE6dOhlbt25tsh4bG2u8/fbbhmEYxvPPP2/06tXL+OMf/2gMGjTIqKmpOeHPW7JkidG3b1/H7QceeMDo2rWrUVtb61gbOHCg8Zvf/MZx+8CBA4YkIyMjwzAMw3jjjTcMScb27dsd93nllVeM0NBQx+3o6GjjlVdeMQzDMBYtWmQMHz68SY6vv/7a8PX1NWw2W7OMJSUlRnR0tPH444+feMcAOO2Y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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f64b0417a20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "get_time_complexity_1(100, example2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### `example3`的时间复杂度为$O(n)$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:31.545757Z",
     "start_time": "2019-06-30T02:50:31.277630Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f64b0506550>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "get_time_complexity_1(100, example3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-29T03:22:18.248412Z",
     "start_time": "2019-06-29T03:22:18.245298Z"
    }
   },
   "source": [
    "###### example4的时间复杂度为$O(n)$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:31.836915Z",
     "start_time": "2019-06-30T02:50:31.549684Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiAAAAGdCAYAAAArNcgqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAMTQAADE0B0s6tTgAAIABJREFUeJzt3XlcVQX+//E3O7KqKCgg4AKaonDdxlxax9H2MjNJK5tmbCoxs81pX20nt5r8tvqtETO1LFvMyiwry5RFRBHZcWNRBGS93PP7o+/wy6lMhXsPcF/Px4M/7sI9b4+Hc96Pc8/9XBfDMAwBAAA4kKvZAQAAgPOhgAAAAIejgAAAAIejgAAAAIejgAAAAIejgAAAAIejgAAAAIejgABo86KiovTqq6+aHQNAK6KAAOiwrFarRowYIRcXF+3du9fsOAB+gQICoMN67LHHFBQUZHYMAL+BAgI4maamJj3wwAMKDw+Xv7+/zjnnHKWnp6upqUmjR4/WX//61+bnbtu2TV5eXvr2228lSR988IFGjRolf39/hYaG6pZbbtGxY8ean//www9r7NixWrhwoXr27KnOnTtr/vz5qq+v1z/+8Q8FBASoX79+2rBhQ/PvvPnmmwoPD9dbb72lXr16yc/PT3//+9/V0NDwu/+G3NxcXXLJJfLz81NoaKhmzZqlmpqa456zdetWLV++XM8++2xrrToArYgCAjiZRx55RB9//LGSk5OVkpKiMWPGaPz48Tp27JiWLVumd955Rx9++KHq6+t13XXXKTExUWPGjJEk1dXV6b777lNaWppWrFihjRs36pFHHjnu9dPT05WamqqNGzdqwYIFuu+++3TppZdq0KBB2rZtmyZMmKDrrrvuuIJRXl6u1157TevWrdN7772njz76SPPnz//N/A0NDZowYYKio6O1bds2rV27Vlu3btUdd9zR/Jza2lpdd911Wrp0qfz9/e2wFgG0mAHAadTW1hqdOnUyduzYcdz90dHRxltvvWUYhmEsWrTI6NGjh/G3v/3NGDBggFFbW/u7r5ecnGz07t27+fZDDz1kdOnSxairq2u+r3///sZFF13UfPvAgQOGJCM9Pd0wDMN44403DEnGrl27mp/zyiuvGEFBQc23IyMjjVdeecUwDMNYtmyZMWzYsONyfPvtt4anp6dhtVoNwzCMWbNmGbfeeqthGIaRl5dnSDKys7NPYg0BcBR3k/sPAAfKyclRbW2tRo0addz9tbW1ys3NlSTNmjVLK1eu1GuvvaYtW7bI29u7+XmZmZm67777tG3bNh05ckRWq1VWq/W414qOjpaXl1fz7ZCQEA0aNOi425JUWlrafJ+/v78GDBjQfHvkyJEqLy9XeXn5r67h2LFjh9LS0uTn59d8n2EYamho0L59+7R37159+umnSk1NPeX1A8BxKCCAE6murpYkffXVV+rcufNxj3Xt2lWSVFZWpj179sjV1VW5ubkaOXJk83MuvfRSDRkyRP/+978VHBysr7/+WjNnzjzudTw8PI677eLictx9Li4ukiSbzfar+07233DWWWdp6dKlv3qsZ8+eev3115WTk6PAwMDjHhswYIDuuecePfHEEye9LAD2QwEBnMgZZ5whT09PHThwQMOHD//N59xyyy0aPHiwpkyZolmzZuncc89VSEiIysrKlJOTo1WrVik+Pl6StHLlylbJVVlZqaysLPXv31/SzxeQBgUF/eYnWOLi4vTBBx8oPDz8uLMzv8w/efLk5tv79+/XhAkT9OGHH2ro0KGtkhdAy1FAACcSEBCgWbNm6eabb1ZDQ4OGDh2qgwcP6sMPP9S0adOUnp6uzz77TDt27FBERITee+89zZw5U2vXrlWXLl3UpUsXvfLKK7rjjju0devW3zwLcTq8vb11880364UXXlBZWZkeeugh3Xrrrb/53GnTpunpp5/W1Vdfrfvvv19dunTRrl27tGnTJj333HMKDg5WcHBw8/P/81ZNdHR089s/AMzHp2AAJ/Pss8/qlltu0Z133qn+/ftrypQpKioqUlBQkGbNmqUXXnhBERERkqRXX31VX3/9td566y25ubnp3//+tz777DMNGjRIS5cu1aOPPtoqmYKCgnTdddfpwgsv1KWXXqoJEybo3nvv/c3n+vv766uvvpKnp6fGjx+vuLg43X///erZs2erZAHgGC6GYRhmhwDgvN58803df//9Ki4uNjsKAAfiDAgAAHA4CggAAHA43oIBAAAOxxkQAADgcBQQAADgcG1yDoiXl5e6d+9udgwAAHAKSktLVV9ff1LPbZMFpHv37nwkDwCAdiY8PPykn8tbMAAAwOEoIAAAwOEoIAAAwOEoIAAAwOEoIAAAwOEoIAAAwOEoIAAAwOEoIAAAwOFOqoDMnj1bUVFRcnFxUUZGRvP92dnZGj16tGJiYjRy5EhlZmae1GMAAMC5nVQBmTx5sjZv3qzIyMjj7r/p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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f64b02a0f98>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "get_time_complexity_1(100, example4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### `example5`的时间复杂度为$O(n^3)$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于`example5`我们另外定义一个可视化函数:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:31.866816Z",
     "start_time": "2019-06-30T02:50:31.851035Z"
    }
   },
   "outputs": [],
   "source": [
    "def get_time_complexity_2(n=100):\n",
    "    op_nums = []\n",
    "    for i in range(1, n):\n",
    "        A = np.random.randint(0, 100, size=(i, ))\n",
    "        B = np.random.randint(0, 100, size=(i, ))\n",
    "        _, num_calc = example5(A, B)\n",
    "        op_nums.append(num_calc)\n",
    "    fig=plt.figure(figsize=(8, 6), dpi= 80, facecolor='w', edgecolor='k')\n",
    "    plt.plot(op_nums)\n",
    "    plt.plot(range(n), [i**2 for i in range(n)])\n",
    "    plt.plot(range(n), [i**3 for i in range(n)])\n",
    "    plt.legend(['example5', '$n^2$', '$n^3$'])\n",
    "    plt.title('example5')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:35.591601Z",
     "start_time": "2019-06-30T02:50:31.870134Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f64b0229a20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "get_time_complexity_2()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### R-3.32 \n",
    "Given an n-element sequence S, Algorithm D calls Algorithm E on each\n",
    "element S[i]. Algorithm E runs in O(i) time when it is called on element\n",
    "S[i]. What is the worst-case running time of Algorithm D?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$0+1+2+ \\cdots + n-1 = \\frac{n(n-1)}{2} => O(n^2)$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### R-3.33\n",
    "Al and Bob are arguing about their algorithms. Al claims his $O(n \\log n)$-\n",
    "time method is always faster than Bob’s $O(n^2)$-time method. To settle the\n",
    "issue, they perform a set of experiments. To Al’s dismay, they find that if\n",
    "$n < 100$, the $O(n^2 )$-time algorithm runs faster, and only when $n ≥ 100$ is\n",
    "the $O(n log n)$-time one better. Explain how this is possible."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "solution: Consider about the constant factor!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### R-3.34\n",
    "There is a well-known city (which will go nameless here) whose inhabi-\n",
    "tants have the reputation of enjoying a meal only if that meal is the best\n",
    "they have ever experienced in their life. Otherwise, they hate it. Assum-\n",
    "ing meal quality is distributed uniformly across a person’s life, describe\n",
    "the expected number of times inhabitants of this city are happy with their\n",
    "meals?\n",
    "\n",
    ">hint: Recall the definition of the Harmonic number, $H_n$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "solution:\n",
    "$$H_n = 1 + \\frac{1}{2} + \\cdots + \\frac{1}{n} => O(\\log n)$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Creativity"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### C-3.35 \n",
    "Assuming it is possible to sort n numbers in $O(n \\log n)$ time, show that it\n",
    "is possible to solve the three-way set disjointness problem in $O(n \\log n)$\n",
    "time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:35.605494Z",
     "start_time": "2019-06-30T02:50:35.594420Z"
    }
   },
   "outputs": [],
   "source": [
    "def disjoint(a: List[Num], b: List[Num], c: List[Num]) -> bool:\n",
    "    all_nums = sorted(a + b + c)\n",
    "    for i in range(2, len(all_nums)):\n",
    "        if all_nums[i] == all_nums[i-1] == all_nums[i-2]:\n",
    "            return False\n",
    "    return True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:35.705249Z",
     "start_time": "2019-06-30T02:50:35.610551Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "disjoint([1, 2], [3, 4], [5, 6])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:35.800557Z",
     "start_time": "2019-06-30T02:50:35.710581Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "disjoint([1, 2], [2, 4], [2, 6])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "基本思路就是： 合并，排序，搜索。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### C-3.36\n",
    "Describe an efficient algorithm for finding the ten largest elements in a\n",
    "sequence of size n. What is the running time of your algorithm?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 排序后切分$O(n\\log n)$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:35.876926Z",
     "start_time": "2019-06-30T02:50:35.804688Z"
    }
   },
   "outputs": [],
   "source": [
    "def max_ten_1(nums: List[Num]) -> List[Num]:\n",
    "    return sorted(nums)[-10:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:36.001415Z",
     "start_time": "2019-06-30T02:50:35.880350Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max_ten_1(range(100))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 替换$O(n)$\n",
    "\n",
    "注意因为`10`是一个`constant`，所以对其进行排序等操作的复杂度都是$O(1)$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:36.089298Z",
     "start_time": "2019-06-30T02:50:36.005084Z"
    }
   },
   "outputs": [],
   "source": [
    "def max_ten_2(nums: List[Num]) -> List[Num]:\n",
    "    result = sorted(nums[:10])\n",
    "    for i in range(10, len(nums)):\n",
    "        if nums[i] > result[0]:\n",
    "            result[0] = nums[i]\n",
    "            result = sorted(result)\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:36.178676Z",
     "start_time": "2019-06-30T02:50:36.094197Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max_ten_2(range(100))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### C-3.41\n",
    "Describe an algorithm for finding both the minimum and maximum of n\n",
    "numbers using fewer than 3n/2 comparisons. (Hint: First, construct a\n",
    "group of candidate minimums and a group of candidate maximums.)\n",
    "\n",
    "参考[stackoverflow](https://stackoverflow.com/questions/13544476/how-to-find-max-and-min-in-array-using-minimum-comparisons),注意对最后一个元素的考虑。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:36.263487Z",
     "start_time": "2019-06-30T02:50:36.180646Z"
    }
   },
   "outputs": [],
   "source": [
    "def min_max(nums: List[Num]) -> List[Num]:\n",
    "    min_num = math.inf\n",
    "    max_num = -math.inf\n",
    "    for i in range(1, len(nums), 2):\n",
    "        if nums[i] >= nums[i-1]:\n",
    "            min_num = min(min_num, nums[i-1])\n",
    "            max_num = max(max_num, nums[i])\n",
    "        else:\n",
    "            min_num = min(min_num, nums[i])\n",
    "            max_num = max(max_num, nums[i-1])\n",
    "    # when len(nums) is odd\n",
    "    # we have to handle the last element\n",
    "    min_num = min(min_num, nums[-1])\n",
    "    max_num = max(max_num, nums[-1])\n",
    "    return [min_num, max_num]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:36.393113Z",
     "start_time": "2019-06-30T02:50:36.265626Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 3]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "min_max([1, 2, 3, 2, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### C-3.42\n",
    "Bob built a Web site and gave the URL only to his n friends, which he\n",
    "numbered from 1 to n. He told friend number i that he/she can visit the\n",
    "Web site at most i times. Now Bob has a counter, C, keeping track of the\n",
    "total number of visits to the site (but not the identities of who visits). What\n",
    "is the minimum value for C such that Bob can know that one of his friends\n",
    "has visited his/her maximum allowed number of times?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "考虑每个人都未达到最大访问量时，总体访问量的最大值。由于$i=1, 2, \\cdots, n$, 所以未达到最大访问量时，每个人最多访问的次数依次为$j = 0, 1, \\cdots, (n-1)$， 将`j`加总得$\\frac{n(n-1)}{2}$, 所以当总的访问量$C=1 + \\frac{n(n-1)}{2}$时，可以断定至少有一个人达到了最大访问量。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### C-3.45 \n",
    "A sequence S contains n − 1 unique integers in the range [0, n − 1], that\n",
    "is, there is one number from this range that is not in S. Design an $O(n)$-\n",
    "time algorithm for finding that number. You are only allowed to use $O(1)$\n",
    "additional space besides the sequence S itself."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:36.474292Z",
     "start_time": "2019-06-30T02:50:36.396008Z"
    }
   },
   "outputs": [],
   "source": [
    "def find_miss(nums: List[Num]) -> Num:\n",
    "    # (n-1) -> m\n",
    "    m = len(nums)\n",
    "    total = 0\n",
    "    for i in range(m):\n",
    "        total += nums[i]\n",
    "    return m*(m + 1) // 2 - total"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:36.563639Z",
     "start_time": "2019-06-30T02:50:36.477516Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "find_miss([0, 1, 2, 4])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### C-3.53\n",
    "An evil king has n bottles of wine, and a spy has just poisoned one of\n",
    "them. Unfortunately, they do not know which one it is. The poison is very\n",
    "deadly; just one drop diluted even a billion to one will still kill. Even so,\n",
    "it takes a full month for the poison to take effect. Design a scheme for\n",
    "determining exactly which one of the wine bottles was poisoned in just\n",
    "one month’s time while expending $O(log n)$ taste testers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:36.651910Z",
     "start_time": "2019-06-30T02:50:36.566827Z"
    }
   },
   "outputs": [],
   "source": [
    "def get_plan(n):\n",
    "    person_num = len(str(bin(n))) - 2\n",
    "    for i in range(1, n+1):\n",
    "        print(str(bin(i))[2:].rjust(person_num, '0'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:36.744656Z",
     "start_time": "2019-06-30T02:50:36.657986Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "00001\n",
      "00010\n",
      "00011\n",
      "00100\n",
      "00101\n",
      "00110\n",
      "00111\n",
      "01000\n",
      "01001\n",
      "01010\n",
      "01011\n",
      "01100\n",
      "01101\n",
      "01110\n",
      "01111\n",
      "10000\n",
      "10001\n",
      "10010\n",
      "10011\n",
      "10100\n"
     ]
    }
   ],
   "source": [
    "get_plan(20)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们对所有n个瓶子，从1开始进行标号，同时将每个标号转化为二进制的数字串。如上例，此时n=20，对应的二进制数字如上。此时，我们只需要5个人即可完成验证。具体方式是，上述第一个人，在第一列的20个数字中，如果是1，则喝掉对应瓶子的酒；如果是0，则不喝。后面四个人以此类推。那么观察5个人的存活情况，若仅有第1，3个人死亡，那么对应的编号就是`10100`,也就是第20个瓶子里面被下了毒。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### C-3.54\n",
    "A sequence S contains n integers taken from the interval [0, 4n], with repe-\n",
    "titions allowed. Describe an efficient algorithm for determining an integer\n",
    "value k that occurs the most often in S. What is the running time of your\n",
    "algorithm?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:36.840882Z",
     "start_time": "2019-06-30T02:50:36.748587Z"
    }
   },
   "outputs": [],
   "source": [
    "def get_most_freq_num(nums: List[int]) -> int:\n",
    "    records = [0] * (4 * len(nums))\n",
    "    for num in nums:\n",
    "        records[num] += 1\n",
    "    max_time = records[0]\n",
    "    max_num = nums[0]\n",
    "    for num, time in enumerate(records):\n",
    "        if time > max_time:\n",
    "            max_time = time\n",
    "            max_num = num\n",
    "    return max_num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-30T02:50:36.930482Z",
     "start_time": "2019-06-30T02:50:36.845054Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_most_freq_num([1, 2, 2, 3, 4, 4, 4, 5])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  },
  "toc": {
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "273.2px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
